extends Node3D
##玩家的运动状态机，用于控制玩家移动和模型动画播放。
class_name 玩家状态机
##初始状态请指定为【基础状态】,该变量只接受基础状态类型节点。。
@export var 当前状态: 基础状态
#载入基础状态，基础状态也是状态机的状态模板。
func _ready() -> void:
	for child in get_children():
		if child is 基础状态:
			child.玩家_状态机 = self
			#获取当前副节点下所有的子节点，因为状态机需要用到这些节点中的功能。
	await get_parent().ready
	#需要等父节点和子节点全部加载完成后，再进入状态机。
	当前状态.进入状态()


#当渲染帧与物理帧更新时，当前状态的两种类型更新。
func _process(_delta: float) -> void:
	当前状态.渲染帧更新触发(_delta)

func _physics_process(_delta: float) -> void:
	当前状态.物理帧更新触发(_delta)


func 切换状态(目标状态名:String) -> void:
	#在玩家状态机底下寻找能否有目标状态名字的节点.
	#如果没找到，则返回状态传入错误，毕竟这是一种基于节点的状态。
	var 目标状态 = get_node_or_null(目标状态名)
	if 目标状态 == null:
		printerr("玩家状态机:传入状态错误，目标状态为空。")
		return
	#退出当前状态，将当前状态改为目标状态，并进入该状态。
	当前状态.退出状态()
	当前状态 = 目标状态
	当前状态.进入状态()
